package lift_simulator;

import java.util.ArrayList;

/**
 * 問題１のためのリフトマネージャです。
 * 単純に入力データの識別番号順に、利用者を運ぶプログラムです。
 * @author Yone6379univ
 *
 */
public class LiftManagerProblem1 extends LiftManager {
	int currentTask;

	public LiftManagerProblem1(Building building) {
		super(building);
		currentTask = 1;
	}

	public LiftManagerProblem1() {
	}

	/**
	 * <pre>
	 * アルゴリズムの説明
	 * リフトがタスクを持っている場合
	 * 	そのタスクを運ぶ。また次のタスクが搭乗可能でかつ同じ階に存在する場合、そのタスクを格納する
	 * リフトがタスクを持っていない場合
	 * 	次のタスクを搭乗しに向かう。搭乗可能タスクがその時点で搭乗不可能な場合、１階で待機する
	 * </pre>
	 */
	public Aim getAim(Lift lift) {		
		//リフトがタスクを持っている場合
		if(lift.getTasks().size()!=0){
			//そいつを運ぶ
			Task havingTask = lift.getTasks().get(0);//今持ってるタスク
			int descendFloorNum = havingTask.getDescend();//今から向かう階
			Direction direction = Direction.getDirection(lift.getCurrentFloor(), descendFloorNum);

			//その階に次の人がいれば載せる
			Floor descendFloor = building.getFloor(descendFloorNum);//次に向かう階
			int[] d = null;//Aimの引数
			for(Task nextTask:descendFloor.getTasks(true)){
				if(nextTask.getId()==currentTask+1){
					d=new int[]{nextTask.getId()};//乗車リストに次のタスクを格納する
					currentTask++;
				}
			}
			Aim ret = new Aim(descendFloorNum,direction,d,new int[]{havingTask.getId()},5);
			return ret;
		}
		//リフトがタスクを持っていない場合
		else{
			//次のタスクがあれば運ぶ
			if(!building.isFinished() && building.getTaskByID(currentTask+1,true)!=null){
				//次のタスクを取得
				currentTask++;
				Task nextTask = building.getTaskByID(currentTask,true);
				Direction direction = Direction.getDirection(lift.getCurrentFloor(),nextTask.getBoard());
				Aim ret = new Aim(nextTask.getBoard(), direction, new int[]{nextTask.getId()},null,5);
				return ret;
			}else{
				//次のタスクが無ければ1Fに戻る
				Direction direction = Direction.getDirection(lift.getCurrentFloor(), 1);
				Aim ret = new Aim(1, direction, null, null,1);
				return ret;
			}
		}
	}

}
